/**
 * 什么是异步函数
 */
/**
 * 什么是异步?
 * 由于 js 是一门单线程语言，他执行一段代码，只能在一个线程里面工作，但是有时候，我们有些任务，
 * 就是想等他执行所有计算，在执行我们这段代码
 * 打个比方: 我们有定时器，我们可以延时执行某段代码，但是可能这时候，js已经执行完了，
 * 那我们该怎么去写这个异步任务呢
 * 异步任务最简单的实际例子:  我们登录一个网站，提交好账号密码，点击登录，这时候，js其实已经执行完了
 * 但是我们是不是得等 服务器那边跟我们说你可以登录，也就是网络那边过来了，
 * 我们才可以进行登录，让他进来主页面
 */
// 异步任务的概念就是上面的例子
// 我先说一下，一般有什么任务是异步任务
// 网络请求，文件读取，js的dom操作(后面讲)，定时器setTimeout,setInterval,promise
// 那异步任务是申请的呢
// 例子
/* function testAsync() {
  let count = 1;
  // setTimeout定时器，这是一个异步任务
  // 需求, 3s后，我会把count+10，我该怎样做
  // 我只要把任务(函数放在这些异步任务操作里面，那么这个任务就会自动被注册为异步任务)
  setTimeout(() => {
    count += 10;
    console.log(count);
  }, 3000);
}
testAsync();
 */

// 怎样拿到结果
// 首先，testCallback函数要接收一个函数callback，这个函数就是我们用来保存异步执行后的结果的
function testCallback(callback) {
  let count = 1;
  // setTimeout定时器，这是一个异步任务
  // 需求, 3s后，我会把count+10，我该怎样做
  // 我只要把任务(函数放在这些异步任务操作里面，那么这个任务就会自动被注册为异步任务)
  setTimeout(() => {
    count += 10;
    // 把结果给callback函数
    callback(count);
  }, 3000);
}
testCallback(
  // 结果保存在callback的参数里面
  (result) => {
    console.log("我是3s后执行的结果", result);
  }
);

// 异步方法书写进阶版
// promise这个非常重要，贯穿前端工程师的整个职业
// 我们把上面方法改写一下
/* function testPromise() {
  let count = 1;
  // 1. 将我们的任务进行promise的包装
  return new Promise((resolve) => {
    // setTimeout定时器，这是一个异步任务
    // 需求, 3s后，我会把count+10，我该怎样做
    // 我只要把任务(函数放在这些异步任务操作里面，那么这个任务就会自动被注册为异步任务)
    setTimeout(() => {
      count += 10;
      //3s后把接力棒扔出来
      resolve(count);
    }, 3000);
  });
}
// 2. 调用之后通过then方法就可以拿到值
testPromise()
  .then((result) => {
    console.log("3s后testPromise", result);
    // return 可以拿给下个人，我把棒+1
    return result + 1;
  })
  .then((result) => {
    console.log("then1", result); // 这些任务都会等上面的结果执行完再走，就像接力棒一样
    // return 可以拿给下个人，我把棒+1
    return result + 1;
  })
  .then((result) => {
    console.log("then2", result); // 这些任务都会等上面的结果执行完再走，就像接力棒一样
    // return 可以拿给下个人，我把棒+1
    return result + 1;
  }); */

// 最终版 async+await
function testAsync1() {
  let count = 1;
  // 1. 将我们的任务进行promise的包装
  return new Promise((resolve) => {
    // setTimeout定时器，这是一个异步任务
    // 需求, 3s后，我会把count+10，我该怎样做
    // 我只要把任务(函数放在这些异步任务操作里面，那么这个任务就会自动被注册为异步任务)
    setTimeout(() => {
      count += 10;
      //3s后把接力棒扔出来
      resolve(count);
    }, 3000);
  });
}
function testAsync2() {
  let count = 1;
  // 1. 将我们的任务进行promise的包装
  return new Promise((resolve) => {
    // setTimeout定时器，这是一个异步任务
    // 需求, 3s后，我会把count+10，我该怎样做
    // 我只要把任务(函数放在这些异步任务操作里面，那么这个任务就会自动被注册为异步任务)
    setTimeout(() => {
      count += 10;
      //3s后把接力棒扔出来
      resolve(count);
    }, 3000);
  });
}
function testAsync3() {
  let count = 1;
  // 1. 将我们的任务进行promise的包装
  return new Promise((resolve) => {
    // setTimeout定时器，这是一个异步任务
    // 需求, 3s后，我会把count+10，我该怎样做
    // 我只要把任务(函数放在这些异步任务操作里面，那么这个任务就会自动被注册为异步任务)
    setTimeout(() => {
      count += 10;
      //3s后把接力棒扔出来
      resolve(count);
    }, 3000);
  });
}
async function Work() {
  /*   let result = await testAsync();
  console.log(result);
  result += 1;
  console.log(result);
  result += 1;
  console.log(result); */
  let result1 = await testAsync1();
  let result2 = await testAsync2();
  let result3 = await testAsync3();
}

console.log(Work());
